package javase.ch06.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 常用的元注解
 *     * @Target
 *         * 作用：用来标识注解使用的位置，如果没有使用该注解标识，则自定义的注解可以使用在任意位置。
 *         * 可使用的值定义在ElementType枚举类中，常用值如下
 *             TYPE，类，接口
 *             FIELD, 成员变量
 *             METHOD, 成员方法
 *             PARAMETER, 方法参数
 *             CONSTRUCTOR, 构造方法
 *             LOCAL_VARIABLE, 局部变量
 *
 *     * @Retention
 *         * 作用：用来标识注解的生命周期(有效范围)
 *         * 可使用的值定义在RetentionPolicy枚举类中，常用值如下
 *             * SOURCE：注解只作用在源码阶段，生成的字节码文件中不存在
 *                      -只在编译期有效，class 文件已经不存在注解
 *             * CLASS：注解作用在源码阶段，字节码文件阶段，运行阶段不存在，默认值
 *                       - 编译期会起作用，class字节码文件哎也存在注解，但是运行阶段是没有的
 *             * RUNTIME：注解作用在源码阶段，字节码文件阶段，运行阶段
 *                       - 编译期会起作用，class字节码文件也存在注解，运行阶段也会存在注解
 *                       - 更适合只定义注解，反射也可以获取注解信息
 */
@MyAnnotation("注解在类上")
public class AnnotationDemo3 {
    private int age;
    @MyAnnotation("注解在方法上")
    public void show() {}
}
//当前注解生命周期
@Retention(RetentionPolicy.RUNTIME)
//当前注解，可以使用的位置
@Target({ElementType.TYPE, ElementType.METHOD})
@interface MyAnnotation {
    String value();
}
